home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / (A)U / (A)U2.ADF / DataToObj / DataToObject.c < prev    next >
C/C++ Source or Header  |  1989-06-03  |  11KB  |  367 lines

  1. #include <libraries/dos.h>
  2. #include <intuition/intuition.h>
  3. #include <exec/memory.h>
  4.  
  5. #define loadname names[0]
  6. #define savename names[1]
  7. #define variablename names[2]
  8. #define variablelenname names[3]
  9. #define BLKSTART (('B'<<24)+('L'<<16)+('O'<<8)+'K')
  10.  
  11. /* ------------- Requester Data -------------------- */
  12.  
  13. struct IntuitionBase     *IntuitionBase=NULL;
  14. struct GfxBase           *GfxBase=NULL;
  15. struct RastPort          *rp;
  16. struct Window            *wn=NULL;
  17. struct IntuiMessage      *msg;
  18. struct TextAttr ta={"topaz.font",8,FS_NORMAL,NULL};
  19. char names[4][33]={"","","",""},undo[33];
  20. ULONG class;
  21.  
  22. struct IntuiText booltext[4]=
  23. {
  24.    {1,0,JAM1,8,1,&ta,"Chip"  ,NULL},
  25.    {1,0,JAM1,8,1,&ta,"Fast"  ,NULL},
  26.    {1,0,JAM1,8,1,&ta,"Save"  ,NULL},
  27.    {1,0,JAM1,0,1,&ta,"Cancel",NULL}
  28. };
  29. struct IntuiText stringtext[3]=
  30. {
  31.    {1,0,JAM1,16,-11,&ta,"Data File"    ,NULL},
  32.    {1,0,JAM1, 8,-11,&ta,"Object File"  ,NULL},
  33.    {1,0,JAM1, 0,-11,&ta,"Variable Name",NULL}
  34. };
  35. struct IntuiText errortext[2]=
  36. {
  37.    {1,0,JAM1,0,0,&ta,"Error,check input",NULL},
  38.    {1,0,JAM1,0,0,&ta,"                 ",NULL},
  39. };
  40. struct StringInfo loadstr= {loadname,    undo,0,32,0,0,0,0,0,0,0};
  41. struct StringInfo savestr= {savename,    undo,0,32,0,0,0,0,0,0,0};
  42. struct StringInfo varstr = {variablename,undo,0,32,0,0,0,0,0,0,0};
  43.  
  44. USHORT booledges[]=
  45.    {-1,-1, 49,-1, 49,9,-1,9,-1,-1};
  46. USHORT stringedges[]=
  47.    {-2,-2,105,-2,105,8,-2,8,-2,-2};
  48.  
  49. struct Border boolborder  ={0,0,1,0,JAM1,5,booledges  ,NULL};
  50. struct Border stringborder={0,0,1,0,JAM1,5,stringedges,NULL};
  51.  
  52. struct Gadget chipgad=
  53.    {NULL,10,15,48,9,GADGHCOMP,RELVERIFY|TOGGLESELECT,
  54.     BOOLGADGET,(APTR)&boolborder,NULL,&booltext[0],NULL,NULL,0,NULL};
  55. struct Gadget fastgad=
  56.    {&chipgad,10,30,48,9,GADGHCOMP,RELVERIFY|TOGGLESELECT,
  57.     BOOLGADGET,(APTR)&boolborder,NULL,&booltext[1],NULL,NULL,1,NULL};
  58. struct Gadget savegad=
  59.    {&fastgad,10,60,48,9,GADGHCOMP|GADGDISABLED,RELVERIFY,
  60.     BOOLGADGET,(APTR)&boolborder,NULL,&booltext[2],NULL,NULL,2,NULL};
  61. struct Gadget cancelgad=
  62.    {&savegad,10,75,48,9,GADGHCOMP,RELVERIFY,
  63.     BOOLGADGET,(APTR)&boolborder,NULL,&booltext[3],NULL,NULL,3,NULL};
  64.  
  65. struct Gadget loadgad=
  66.    {&cancelgad,76,25,104,10,GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET,
  67.     (APTR)&stringborder,NULL,&stringtext[0],NULL,(APTR)&loadstr,4,NULL};
  68. struct Gadget objectgad=
  69.    {&loadgad,  76,50,104,10,GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET,
  70.     (APTR)&stringborder,NULL,&stringtext[1],NULL,(APTR)&savestr,5,NULL};
  71. struct Gadget variablegad=
  72.    {&objectgad,76,75,104,10,GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET,
  73.     (APTR)&stringborder,NULL,&stringtext[2],NULL,(APTR)&varstr,6,NULL};
  74.  
  75. struct NewWindow nw=
  76. {
  77.  60,40, 200,100, 0,1,
  78.  GADGETUP|CLOSEWINDOW,
  79.  WINDOWDEPTH|WINDOWCLOSE|WINDOWDRAG|SIMPLE_REFRESH|ACTIVATE|RMBTRAP,
  80.  &variablegad,
  81.  NULL,
  82.  "Data to Object",
  83.  NULL, NULL, NULL,NULL,NULL,NULL,
  84.  WBENCHSCREEN,
  85. };
  86.  
  87. /* ------------- Program Data -------------------- */
  88.  
  89. BOOL fast=FALSE,chip=FALSE;
  90. BPTR flock,in,out;
  91. short i;
  92.  
  93. struct DataToWrite
  94. {
  95.  char  *start;        /* pointer to the data */
  96.  ULONG length;        /* length of the data block to write */
  97. };
  98.  
  99. struct ObjectFile
  100. {
  101.  ULONG Hunk_Unit;     /* type of file, this a object file (0x3e7) */
  102.  ULONG Namelen;       /* length of the name of this hunk (0 = no name) */
  103.  ULONG Hunk_Data;     /* start of a data hunk (0x3ea) */
  104.  ULONG HunkLen;
  105.  /* length in long words */
  106.  
  107.  ULONG datastart1;    /* 'BLOK' */
  108.  struct DataToWrite data;  /* data info */
  109.  
  110.  ULONG RealLength;    /* used to store the real length of the data-file */
  111.  ULONG Hunk_Ext;      /* start of external definitions (0x3ef) */
  112.  ULONG Ext_Def1;      /* type of definition (01 = external definition) */
  113.  
  114.  ULONG datastart2;    /* 'BLOK' */
  115.  struct DataToWrite varname;  /* name of the data hunk */
  116.  
  117.  ULONG Value1;        /* offset in data hunk */
  118.  ULONG Ext_Def2;      /* same for the length of the data hunk */
  119.  
  120.  ULONG datastart3;
  121.  struct DataToWrite varlenname;
  122.  
  123.  ULONG Value2;
  124.  ULONG Hunk_Ext_End;  /* end of external definitions = null */
  125.  ULONG Hunk_End;      /* =0x3f2 */
  126. }object=
  127. {
  128.  0x3e7,
  129.  NULL,
  130.  0x3ea,
  131.  NULL,
  132.  BLKSTART,
  133.  {NULL,NULL},
  134.  NULL,
  135.  0x3ef,
  136.  0x01000000,
  137.  BLKSTART,
  138.  {variablename,NULL},
  139.  NULL,
  140.  0x01000000,
  141.  BLKSTART,
  142.  {variablelenname,NULL},
  143.  NULL,
  144.  NULL,
  145.  0x3f2
  146. };
  147.  
  148. void main(),get_parms(),refreshwindow(),quit(),set_defaults();
  149. BOOL writeobj();
  150.  
  151. /*------------------------ Main program ---------------------------*/
  152. void main(argc,argv)
  153. short argc;
  154. char *argv[];
  155. {
  156.  for(i=1;i<4 && i<argc && *argv[i]!='-';i++) /* get names for files and */
  157.   strcpy(names[i-1],argv[i]);                /* variables */
  158.  
  159.  if(argc && *argv[i]=='-')                   /* check for options */
  160.   if(!stricmp(argv[i],"-f"))                 /* -f = fast-mem */
  161.   {
  162.    fastgad.Flags|=SELECTED;
  163.    fast=TRUE;
  164.   }
  165.   else if(!stricmp(argv[i],"-c"))            /* -c = chip-mem */
  166.   {
  167.    chipgad.Flags|=SELECTED;
  168.    chip=TRUE;
  169.   }
  170.  if(!(IntuitionBase=(struct IntuitionBase*)
  171.    OpenLibrary("intuition.library",0L))) exit(20);
  172.  if(!(GfxBase=(struct GfxBase*)
  173.    OpenLibrary("graphics.library",0L))) quit(20);
  174.  
  175.  set_defaults();
  176.  
  177.  if(i!=4) get_parms(NULL); /* if parameters are missing,create a requester */
  178.  
  179.  while(!writeobj())        /* pop up the requester until we did write the */
  180.   get_parms(1);            /* object file to disk */
  181.  
  182.  quit(0);
  183. }
  184.  
  185. /*------------------ Get parameters from a requester ------------------*/
  186. void get_parms(error)
  187. short error;
  188. {
  189.  if(!wn)
  190.   if(!(wn=(struct Window *) OpenWindow(&nw))) quit(20);
  191.  
  192.  /* if the requester was created by an error, display message */
  193.  if(error) PrintIText(wn->RPort,&errortext[0],28,90);
  194.  for(;;)
  195.  {
  196.   /* enable SAVE gadget if all data have been entered */
  197.   if(*loadname && *variablename && *savename &&
  198.      savegad.Flags & GADGDISABLED)
  199.   {
  200.    OnGadget(&savegad,wn,NULL);
  201.    refreshwindow();
  202.   }
  203.   else /* disable SAVE gadget */
  204.   if((!*loadname || !*variablename || !*savename) &&
  205.      !(savegad.Flags & GADGDISABLED))
  206.   {
  207.    OffGadget(&savegad,wn,NULL);
  208.    refreshwindow();
  209.   }
  210.   WaitPort(wn->UserPort);
  211.   if(msg=(struct IntuiMessage*)GetMsg(wn->UserPort))
  212.   {
  213.    class=msg->Class;
  214.    ReplyMsg(msg);
  215.    switch(class)
  216.    {
  217.     case CLOSEWINDOW:
  218.      quit(20);
  219.     case GADGETUP:
  220.      switch (((struct Gadget*)msg->IAddress)->GadgetID)
  221.      {
  222.       case 0:         /* CHIP */
  223.        chip^=TRUE;    /* toggle */
  224.        fastgad.Flags&=~SELECTED;
  225.        fast=FALSE;
  226.        refreshwindow();
  227.        break;
  228.       case 1:         /* FAST */
  229.        fast^=TRUE;    /* toggle */
  230.        chipgad.Flags&=~SELECTED;
  231.        chip=FALSE;
  232.        refreshwindow();
  233.        break;
  234.       case 2:         /* SAVE */
  235.        return;
  236.       case 3:         /* CANCEL */
  237.        quit(20);
  238.       case 4:         /* DATAFILE */
  239.        set_defaults();
  240.        refreshwindow();
  241.      }
  242.    }
  243.    if(error)
  244.    {
  245.     PrintIText(wn->RPort,&errortext[1],28,90);
  246.     error=NULL;
  247.    }
  248.   }
  249.  }
  250. }
  251.  
  252. /*------------------ Refresh Window and Gadgets ------------------*/
  253. void refreshwindow()
  254. {
  255.  SetRast(wn->RPort,0); /* clear window */
  256.  /* refresh gadgets; if anyone knows why this works better than */
  257.  /* RefreshGadget(), please tell me. */
  258.  RefreshWindowFrame(wn);
  259. }
  260.  
  261. /*---------------------- Clean up and Exit ----------------------*/
  262. void quit(errnum)
  263. short errnum;
  264. {
  265.  if (wn)            CloseWindow(wn);
  266.  if (IntuitionBase) CloseLibrary(IntuitionBase);
  267.  if (GfxBase)       CloseLibrary(GfxBase);
  268.  exit(errnum);
  269. }
  270.  
  271. /*---------------------- Write Object File ----------------------*/
  272. BOOL writeobj()
  273. {
  274.  struct FileInfoBlock *fib;
  275.  BOOL success=FALSE;
  276.  ULONG *pointer;
  277.  
  278.  strcpy(variablelenname,variablename);
  279.  strcat(variablelenname,"len");
  280.  object.varname.length    =((strlen(variablename)+3) >> 2) <<2;
  281.  object.Ext_Def1         |=((strlen(variablename)+3) >> 2);
  282.  object.varlenname.length =((strlen(variablelenname)+3) >> 2) <<2;
  283.  object.Ext_Def2         |=((strlen(variablelenname)+3) >> 2);
  284.  object.Hunk_Data |= (fast << 31) | (chip << 30);
  285.  
  286.  if(flock=Lock(loadname,ACCESS_READ)) /* data file */
  287.  {
  288.   if(fib=(struct FileInfoBlock*)
  289.      AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC))
  290.   {
  291.    if(Examine(flock,fib))             /* get info; we need the size */
  292.    {
  293.     if(fib->fib_DirEntryType<0)       /* is it a file ? */
  294.     {
  295.      object.HunkLen = ((fib->fib_Size+3) >> 2)+1;
  296.      object.data.length = ((fib->fib_Size+3) >> 2) << 2;
  297.      object.RealLength = fib->fib_Size;
  298.      object.Value2 = ((fib->fib_Size+3) >> 2) << 2;
  299.  
  300.      if(in=Open(loadname,MODE_OLDFILE)) /* yes, open */
  301.      {
  302.       if(object.data.start= (char*) AllocMem(fib->fib_Size,
  303.                                              MEMF_CLEAR|MEMF_PUBLIC))
  304.       {
  305.        if(out=Open(savename,MODE_NEWFILE)) /* open object file */
  306.        {
  307.         if(Read(in,object.data.start,fib->fib_Size)==fib->fib_Size)
  308.         {
  309.          for (pointer=(ULONG*)&object;pointer <= &object.Hunk_End;pointer++)
  310.          {
  311.           if(*pointer!=BLKSTART)
  312.           {
  313.            if(!Write(out,pointer,sizeof(ULONG))) break;
  314.           }
  315.           else if(!Write(out,*(++pointer),*(++pointer))) break;
  316.          }
  317.          Close(out);
  318.          success=TRUE;
  319.         }
  320.        }     /* if out */
  321.        FreeMem(object.data.start,fib->fib_Size);
  322.       }     /* if buffer */
  323.       Close(in);
  324.      }     /* if in */
  325.     }     /* if DirEntryType */
  326.    }     /* if Info */
  327.    FreeMem(fib,sizeof(struct FileInfoBlock));
  328.   }     /* if fib */
  329.   UnLock(flock);
  330.  }     /* if flock */
  331.  return(success);
  332. }
  333.  
  334. /*------------------------- Set default names ---------------------*/
  335. void set_defaults()                           /* fill name requesters with */
  336. {                                             /* default names */
  337.  short strstart,strend;
  338.  
  339.  if(*loadname)                                /* we need the data filename */
  340.  {
  341.   /* search and replace filename extension */
  342.   for(strend=strlen(loadname)-1;strend>-1;strend--)
  343.    if(loadname[strend]=='.') break;
  344.  
  345.   if(strend==-1) strend=strlen(loadname);
  346.  
  347.   if(!*savename)
  348.   {
  349.    strncpy(savename,loadname,strend);
  350.    savename[strend]='\0';
  351.    strcat(savename,".o");                   /* new extension is '.o' */
  352.   }
  353.   if(!*variablename)
  354.   {
  355.    /* default variablename is */
  356.    /* '_'+filename without the path and w/o the file extension */
  357.    for(strstart=strlen(loadname)-1;strstart>-1;strstart--)
  358.    if(loadname[strstart]=='/' || loadname[strstart]==':') break;
  359.    strstart++;
  360.    if(strend < strstart) strstart=0;
  361.    strcpy(variablename,"_");
  362.    strncat(variablename,&loadname[strstart],strend-strstart);
  363.    /*variablename[strend-strstart+1]='\0';*/
  364.   }
  365.  }
  366. }
  367.